load = function(_opt) {
	var img = new Image();
	img.src = _opt.url;
	img.onload = function() {
		if(_opt.callback) _opt.callback(img);
	};
};

/** *****************************原生扩展****************************** */
~function() {
	// 对Date的扩展，将 Date 转化为指定格式的String
	// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
	// 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
	// 例子：
	// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
	// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
	Date.prototype.format = function(fmt) { // author: meizz
		var o = {
			"M+" : this.getMonth() + 1, // 月份
			"d+" : this.getDate(), // 日
			"h+" : this.getHours(), // 小时
			"m+" : this.getMinutes(), // 分
			"s+" : this.getSeconds(), // 秒
			"q+" : Math.floor((this.getMonth() + 3) / 3), // 季度
			"S" : this.getMilliseconds()
		// 毫秒
		};
		if (/(y+)/.test(fmt))
			fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "")
					.substr(4 - RegExp.$1.length));
		for ( var k in o)
			if (new RegExp("(" + k + ")").test(fmt))
				fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k])
						: (("00" + o[k]).substr(("" + o[k]).length)));
		return fmt;
	};

	Date.prototype.show = function() {
		var format = function(d) {
			var newDate = {};
			newDate.year = d.getFullYear();
			newDate.month = d.getMonth();
			newDate.day = d.getDate();
			newDate.week = d.getDay();
			newDate.hour = d.getHours();
			newDate.minute = d.getMinutes();
			newDate.second = d.getSeconds();
			return newDate;
		};
		
		var formatNow = function() {
			return format(new Date());
		};

		var weekArray = [ "周日", "周一", "周二", "周三", "周四", "周五", "周六" ], 
			diffWeekValue = 0, 
			nowDate = formatNow(), 
			messageDate = format(this);
		
		if (nowDate.year - messageDate.year > 0) {
			return messageDate.year + "年" + messageDate.month + "月"
					+ messageDate.day + "日";
		}
		if (nowDate.month - messageDate.month > 0
				|| nowDate.day - messageDate.day > nowDate.week) {
			return messageDate.month + "月" + messageDate.day + "日";
		}
		if (nowDate.day - messageDate.day <= nowDate.week
				&& nowDate.day - messageDate.day > 1) {
			diffWeekValue = nowDate.week - (nowDate.day - messageDate.day);
			return weekArray[diffWeekValue];
		}
		if (nowDate.day - messageDate.day === 1) {
			return "昨天";
		}
		if (nowDate.hour - messageDate.hour > 0) {
			return (nowDate.hour - messageDate.hour) + "小时前";
		}
		if (nowDate.minute - messageDate.minute > 0) {
			return (nowDate.minute - messageDate.minute) + "分钟前";
		}
		return "1分钟前";
	};

	String.prototype.trim = function() {
		return this.replace(/(^\s*)|(\s*$)/g, '');
	};

	String.prototype.ltrim = function() {
		return this.replace(/^\s*/g, '');
	};

	String.prototype.rtrim = function() {
		return this.replace(/\s*$/, '');
	};

	String.prototype.equals = function(str) {
		return this.toString() === str;
	};

	String.prototype.equalsIgnoreCase = function(str) {
		return this.toString().toUpperCase() === str.toUpperCase();
	};

	String.prototype.replaceAll = function(AFindText, ARepText) {
		raRegExp = new RegExp(AFindText, "g");
		return this.replace(raRegExp, ARepText);
	};
	
	//字符转日期
	String.prototype.parseDate = function(fmt) {
		var date, s = this.toString();
		date =  new Date(s.replaceAll("-", "/").split(".")[0]);
		if(date == "Invalid Date")
			date =  new Date(parseInt(s));
		if(fmt) return date.format(fmt);
		return date;
	};
	
	//转换方法
	String.prototype.parseFunction = function() {
		var s = this.toString();
		return new Function('return '+s)();;
	};
	
	
}();




/** *****************************常用工具****************************** */
~function() {
	var Util = function() {
	};
	$.extend({
		Util : Util
	});

	/**
	 * 获取guid
	 */
	Util.uuid = function() {
		var uuid = "";
		for ( var i = 1; i <= 32; i++) {
			var n = Math.floor(Math.random() * 16.0).toString(16);
			uuid += n;
		}
		return uuid;
	};

	/**
	 * 获取url参数
	 */
	Util.para = function(name) {
		var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); // 构造一个含有目标参数的正则表达式对象
		var r = window.location.search.substr(1).match(reg); // 匹配目标参数
		if (r != null)
			return unescape(r[2]);
		return null; // 返回参数值
	};

	/**
	 * 获取数据类型
	 */
	Util.getDataType = function(data) {
		var type = typeof data;
		if (type != "object")
			return type;
		if (data.length == undefined)
			return "json";
		return "array";
	};
	
	//封装jquery ajax请求
	Util.ajax = function(_opt) {
		//请求前处理
		$.Util.ajax.count += 1;
		//数据加载提示
		
		var ajax = $.ajax(_opt).done(function() {
			//业务处理前，处理
			$.Util.ajax.count -= 1;
			if(!$.Util.ajax.count) {
				//数据加载完成
				//数据加载移除
			}
			console.log('处理前');
		}) ;
		
		setTimeout(function() {
			ajax.done(function() {
				//业务处理后，处理
				console.log('处理后');
				$.Util.Image.preload();
			});
		}, 1);
		
		return ajax;
	};
	//计数(当前ajax未完成数)
	Util.ajax.count = 0;

	
	//_opt   k-v 参数
	//startDate(开始时间) 或  leftTime(剩余时间毫秒数) 不能同时未空
	//leftCallback(time, txt)  回调当前剩余时间
	//endCallback  倒计时结束回调
	Util.leftTime = function(_opt) {
		var leftTime = function(){
		    var endTime = _opt.startDate || new Date(new Date().getTime() + _opt.leftTime);  //结束时间
		    var curTime = new Date();//当前时间
		    var leftTime = parseInt((endTime.getTime() - curTime.getTime())/1000);//获得时间差
		    var time = {};
		    //小时、分、秒需要取模运算
		    
		    time.d = parseInt(leftTime/(60*60*24));
		    time.h = parseInt(leftTime/(60*60)%24);
		    time.m = parseInt(leftTime/60%60);
		    time.s = parseInt(leftTime%60);
		    time.ms = parseInt(((endTime.getTime() - curTime.getTime())/100)%10);
		    var txt = time.d+"天"+time.h+"小时"+time.m+"分钟"+time.s+"秒";
		    
		    if(leftTime<=0){
		    	clearInterval(set);
		    	if(_opt.endCallback) _opt.endCallback();
		    } else {
		    	if(_opt.leftCallback) _opt.leftCallback(time, txt);
		    }
	  };
	  leftTime();
	  var set = setInterval(leftTime,100);
	};
	
	//行转列
	Util.rowToCol = function(arr) {
		if(!arr) throw new Error('行转列数据不能为空');
		if(Util.getDataType(arr) != "array") throw new Error('行转列数据是非数据');
		
		var result = [];
		
		//array array
		if(Util.getDataType(arr[0]) == "array") {
			$(arr).each(function(i, e) {
				$(e).each(function(ii, ee) {
					if(!result[ii]) result[ii] = [];
					result[ii][i] = ee;
				});
			});
		} else if(Util.getDataType(arr[0]) == "json") {
			$(arr).each(function(i, e) {
				var ii = 0;
				for(var ee in e) {
					if(!result[ii]) result[ii] = {};
					result[ii][ee] = e[ee];
					ii ++;
				}
			});
		} else {
			throw new Error('行转列数据格式不正确');
		}
		
		return result;
	}
	
}();




/** *****************************文件处理****************************** */
~function() {
	var File = function() {
	};
	$.Util.File = File;

	/**
	 * 获取blob文件地址
	 * 
	 * @param file
	 *            input中文件
	 */
	File.getUrl = function(file) {
		var url = null;
		if (window.createObjectURL != undefined) { // basic
			url = window.createObjectURL(file);
		} else if (window.URL != undefined) { // mozilla(firefox)
			url = window.URL.createObjectURL(file);
		} else if (window.webkitURL != undefined) { // webkit or chrome
			url = window.webkitURL.createObjectURL(file);
		}
		return url;
	};

	/**
	 * 文件上传
	 * 
	 * @param _opt
	 *            一个以"{键:值}"组成设置 url：上传的地址 file： 上传的文件 progress： 上传的进度
	 * @returns
	 */
	File.upload = function(_opt) {
		var formData = new FormData();
		formData.append("file", _opt.file);
		// 必须false才会避开jQuery对 formdata 的默认处理
		// XMLHttpRequest会对 formdata 进行正确的处理
		return $.ajax({
			type : "POST",
			url : _opt.url,
			data : formData,
			processData : false,
			// 必须false才会自动加上正确的Content-Type
			contentType : false,
			xhr : function() {
				var xhr = $.ajaxSettings.xhr();
				if (xhr.upload) {
					xhr.upload.addEventListener("progress", function(evt){
						var loaded = evt.loaded;     // 已经上传大小情况
						var tot = evt.total;      // 附件总大小
						var per = Math.floor(100*loaded/tot);  // 已经上传的百分比
						if(_opt.progress) _opt.progress(evt, per);
					}, false);
					return xhr;
				}
			}
		});
	};
	
	/**
	 * 文件下载
	 * url 文件地址
	 * name  文件名
	 */
	File.download = function(_opt) {
		var a = document.createElement('a');
		a.href = _opt.url;
		a.download = _opt.name || '';
		a.click();
	}
}();




/** *****************************图片处理****************************** */
~function() {
	var Image = function() {
	};
	$.Util.Image = Image;

	/**
	 * 图片压缩，默认同比例压缩
	 * 
	 * @param _opt
	 *            一个以"{键:值}"组成设置 url： pc端传入的路径可以为相对路径，但是在移动端上必须传入的路径是照相图片储存的绝对路径
	 *            quality 照片质量默认：0.7 width： 压缩后图片宽 height： 压缩后图片高
	 * @param： callback 回调函数有一个参数，base64的字符串数据
	 */
	Image.compress = function(_opt) {
		load({
			url: _opt.url,
			callback: function(img) {
				var that = img;
				// 默认按比例压缩
				var w = that.width, h = that.height, scale = w / h;
				w = _opt.width || w;
				h = _opt.height || (w / scale);
				var quality = 0.7; // 默认图片质量为0.7
				// 生成canvas
				var canvas = document.createElement('canvas');
				var ctx = canvas.getContext('2d');
				// 创建属性节点
				var anw = document.createAttribute("width");
				anw.nodeValue = w;
				var anh = document.createAttribute("height");
				anh.nodeValue = h;
				canvas.setAttributeNode(anw);
				canvas.setAttributeNode(anh);
				ctx.drawImage(that, 0, 0, w, h);
				// 图像质量
				if (_opt.quality && _opt.quality <= 1 && _opt.quality > 0) {
					quality = _opt.quality;
				}
				// quality值越小，所绘制出的图像越模糊
				var base64 = canvas.toDataURL('image/jpeg', quality);
				// 回调函数返回base64的值
				_opt.callback(base64);
			}
		});
		
	};
	
	//图片加载
	$.Util.Image.load = load;
	window.load = load;
	
	//图片预加载
	Image.preload = function() {
		$('[preload]').each(function(i, e) {
			var obj = $(e);
			var url = obj.attr('preload');
			obj.removeAttr('preload');
			obj.attr('src', global.preloadGif);
			
			load({
				url: url,
				callback: function(img) {
					var src = img.src;
					src = src.endsWith('/') ? src.slice(0, -1) : src;
					obj.attr('src', src);
				}
			});
		});
	};

}();




/** *****************************校验处理****************************** */
~function() {
	var Chect = function() {
	};
	$.Util.Chect = Chect;

	var regExp = {
		intege : "^-?[1-9]*$", // 整数
		intege1 : "^\d+$", // 正整数
		intege2 : "^-[1-9]*$", // 负整数
		num : "^([+-]?)//d*//.?//d+$", // 数字
		num1 : "^([1-9]//d*|0)$", // 正数（正整数 + 0）
		num2 : "^-[1-9]//d*|0$", // 负数（负整数 + 0）
		decmal : "^([+-]?)//d*//.//d+$", // 浮点数
		decmal1 : "^[1-9]//d*.//d*|0.//d*[1-9]//d*$", // 正浮点数
		decmal2 : "^-([1-9]//d*.//d*|0.//d*[1-9]//d*)$",// 负浮点数
		decmal3 : "^-?([1-9]//d*.//d*|0.//d*[1-9]//d*|0?.0+|0)$", // 浮点数
		decmal4 : "^[1-9]//d*.//d*|0.//d*[1-9]//d*|0?.0+|0$", // 非负浮点数（正浮点数 +
		// 0）
		decmal5 : "^(-([1-9]//d*.//d*|0.//d*[1-9]//d*))|0?.0+|0$",// 非正浮点数（负浮点数
		// + 0）
		email : "^//w+((-//w+)|(//.//w+))*//@[A-Za-z0-9]+((//.|-)[A-Za-z0-9]+)*//.[A-Za-z0-9]+$", // 邮件
		color : "^[a-fA-F0-9]{6}$", // 颜色
		url : "^http[s]?://////([//w-]+//.)+[//w-]+([//w-./?%&=]*)?$", // url
		chinese : "^[//u4E00-//u9FA5//uF900-//uFA2D]+$", // 仅中文
		ascii : "^[//x00-//xFF]+$", // 仅ACSII字符
		zipcode : "^//d{6}$", // 邮编
		mobile : "^(13|15|18)[0-9]{9}$", // 手机
		ip4 : "^(25[0-5]|2[0-4]//d|[0-1]//d{2}|[1-9]?//d)//.(25[0-5]|2[0-4]//d|[0-1]//d{2}|[1-9]?//d)//.(25[0-5]|2[0-4]//d|[0-1]//d{2}|[1-9]?//d)//.(25[0-5]|2[0-4]//d|[0-1]//d{2}|[1-9]?//d)$", // ip地址
		port : "^([0-9]|[1-9]//d|[1-9]//d{2}|[1-9]//d{3}|[1-5]//d{4}|6[0-4]//d{3}|65[0-4]//d{2}|655[0-2]//d|6553[0-5])$",
		notempty : "^\s*$", // 非空
		picture : "(.*)//.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$", // 图片
		rar : "(.*)//.(rar|zip|7zip|tgz)$", // 压缩文件
		date : "^//d{4}(//-|///|/.)//d{1,2}//1//d{1,2}$", // 日期
		qq : "^[1-9]*[1-9][0-9]*$", // QQ号码
		tel : "^((0[0-9]{2,3})-)?([0-9]{7,8})(-([0-9]{3,}))?$", // 电话号码的函数(包括验证国内区号,国际区号,分机号)
		username : "^//w+$", // 用来用户注册。匹配由数字、26个英文字母或者下划线组成的字符串
		letter : "^[A-Za-z]+$", // 字母
		letter_u : "^[A-Z]+$", // 大写字母
		letter_l : "^[a-z]+$", // 小写字母
		idcard : "^[1-9]([0-9]{14}|[0-9]{17})$", // 身份证
		char_256 : "^.{20,256}$", // 字符长度不超过256
		mobileOrtel : '^1[34578][0-9]{9}$|^((0[0-9]{2,3})-)?([0-9]{7,8})(-([0-9]{3,}))?$'
	};

	var msg = {
		intege : "请输入整数", // 整数
		intege1 : "请输入正整数", // 正整数
		intege2 : "请输入负整数", // 负整数
		num : "请输入数字", // 数字
		num1 : "请输入正数", // 正数（正整数 + 0）
		num2 : "^-[1-9]//d*|0$", // 负数（负整数 + 0）
		decmal : "^([+-]?)//d*//.//d+$", // 浮点数
		decmal1 : "^[1-9]//d*.//d*|0.//d*[1-9]//d*$", // 正浮点数
		decmal2 : "^-([1-9]//d*.//d*|0.//d*[1-9]//d*)$", // 负浮点数
		decmal3 : "^-?([1-9]//d*.//d*|0.//d*[1-9]//d*|0?.0+|0)$", // 浮点数
		decmal4 : "^[1-9]//d*.//d*|0.//d*[1-9]//d*|0?.0+|0$", // 非负浮点数（正浮点数 +
		// 0）
		decmal5 : "^(-([1-9]//d*.//d*|0.//d*[1-9]//d*))|0?.0+|0$",// 非正浮点数（负浮点数
		// + 0）
		email : "^//w+((-//w+)|(//.//w+))*//@[A-Za-z0-9]+((//.|-)[A-Za-z0-9]+)*//.[A-Za-z0-9]+$", // 邮件
		color : "^[a-fA-F0-9]{6}$", // 颜色
		url : "^http[s]?://////([//w-]+//.)+[//w-]+([//w-./?%&=]*)?$", // url
		chinese : "^[//u4E00-//u9FA5//uF900-//uFA2D]+$", // 仅中文
		ascii : "^[//x00-//xFF]+$", // 仅ACSII字符
		zipcode : "^//d{6}$", // 邮编
		mobile : "请输入有效的手机号码", // 手机
		ip4 : "请输入有效的ip地址", // ip地址
		port : "请输入有效的端口号",
		notempty : "请填写此内容", // 非空
		picture : "(.*)//.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$", // 图片
		rar : "(.*)//.(rar|zip|7zip|tgz)$", // 压缩文件
		date : "^//d{4}(//-|///|/.)//d{1,2}//1//d{1,2}$", // 日期
		qq : "请输入正确qq号码", // QQ号码
		tel : "请输入有效的电话号码", // 电话号码的函数(包括验证国内区号,国际区号,分机号)
		username : "^//w+$", // 用来用户注册。匹配由数字、26个英文字母或者下划线组成的字符串
		letter : "请输入有效的字母", // 字母
		letter_u : "请输入有效的大写字母", // 大写字母
		letter_l : "请输入有效的小写字母", // 小写字母
		idcard : "请输入有效的身份证号", // 身份证
		char_256 : "字符长度不少于20且不超过256",
		mobileOrtel : "请输入有效的手机号码或者电话号码"
	};

	Chect.match = function(_opt) {
		var isMatch = new RegExp(regExp[_opt.reg]).test(_opt.value);
		if (_opt.callback)
			_opt.callback(isMatch, msg[_opt.reg]);
		return {
			isMatch : isMatch,
			msg : msg[_opt.reg]
		};
	};

}();

/** *****************************校验处理****************************** */


/** *****************************字体处理****************************** */
~function() {
	var Font = function() {
		var baseFonts = [ 'monospace', 'sans-serif', 'serif' ];
		var testString = "mmmmmmmmmmlli";
		var testSize = '72px';
		var h = document.getElementsByTagName("body")[0];
		var s = document.createElement("span");
		s.style.fontSize = testSize;
		s.innerHTML = testString;
		var defaultWidth = {};
		var defaultHeight = {};

		for ( var index in baseFonts) {
			s.style.fontFamily = baseFonts[index];
			h.appendChild(s);
			defaultWidth[baseFonts[index]] = s.offsetWidth; 
			defaultHeight[baseFonts[index]] = s.offsetHeight; 
			h.removeChild(s);
		}

		var match = function(font) {
			var detected = false;
			for ( var index in baseFonts) {
				s.style.fontFamily = font + ',' + baseFonts[index]; 
				h.appendChild(s);
				var matched = (s.offsetWidth != defaultWidth[baseFonts[index]] || s.offsetHeight != defaultHeight[baseFonts[index]]);
				h.removeChild(s);
				detected = detected || matched;
			}
			return detected;
		}
		
		var filter = function(_fontList) {
			var fontList = [];
			for(var i=0; i<_fontList.length; i++) {
				if(match(_fontList[i])) fontList.push(_fontList[i]);
			}
			
			return fontList;
		}
		
		return {
			match: match,
			filter: filter
		}

		this.match = match;
	};

	$.Util.Font = Font;
}();
/** *****************************字体处理****************************** */


/** *****************************事件处理****************************** */
~function() {
	// 链接处理
	$('body').on('touchend', '[i-href]', function() {
		location.href = $(this).attr('i-href');
	});
}();
/** *****************************事件处理****************************** */
